// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/mac/launch_services_util.h"

#include "base/logging.h"
#include "base/mac/mac_logging.h"
#include "base/mac/mac_util.h"
#include "base/mac/scoped_cftyperef.h"
#include "base/strings/sys_string_conversions.h"

namespace base {
namespace mac {

    bool OpenApplicationWithPath(const base::FilePath& bundle_path,
        const CommandLine& command_line,
        LSLaunchFlags launch_flags,
        ProcessSerialNumber* out_psn)
    {
        FSRef app_fsref;
        if (!base::mac::FSRefFromPath(bundle_path.value(), &app_fsref)) {
            LOG(ERROR) << "base::mac::FSRefFromPath failed for " << bundle_path.value();
            return false;
        }

        std::vector<std::string> argv = command_line.argv();
        int argc = argv.size();
        base::ScopedCFTypeRef<CFMutableArrayRef> launch_args(
            CFArrayCreateMutable(NULL, argc - 1, &kCFTypeArrayCallBacks));
        if (!launch_args) {
            LOG(ERROR) << "CFArrayCreateMutable failed, size was " << argc;
            return false;
        }

        for (int i = 1; i < argc; ++i) {
            const std::string& arg(argv[i]);

            base::ScopedCFTypeRef<CFStringRef> arg_cf(base::SysUTF8ToCFStringRef(arg));
            if (!arg_cf) {
                LOG(ERROR) << "base::SysUTF8ToCFStringRef failed for " << arg;
                return false;
            }
            CFArrayAppendValue(launch_args, arg_cf);
        }

        LSApplicationParameters ls_parameters = {
            0, // version
            launch_flags,
            &app_fsref,
            NULL, // asyncLaunchRefCon
            NULL, // environment
            launch_args,
            NULL // initialEvent
        };
        // TODO(jeremya): this opens a new browser window if Chrome is already
        // running without any windows open.
        OSStatus status = LSOpenApplication(&ls_parameters, out_psn);
        if (status != noErr) {
            OSSTATUS_LOG(ERROR, status) << "LSOpenApplication";
            return false;
        }
        return true;
    }

} // namespace mac
} // namespace base
